# C/C++ GPIO development ***Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.*** --- This document describes the recommended method for accessing GPIO using C/C++ on the Quectel Pi M2. The current development board has been verified to support libgpiod v1.6.3, and the libgpiod approach is recommended by default. # Environment Setup ```bash sudo apt update sudo apt install -y build-essential gpiod libgpiod-dev gpiodetect --version gpiodetect ``` | **Item** | **Description** | | --- | --- | | Recommended Library | libgpiod | | Compilation Option | `-lgpiod` | | Main Controller | Currently verified as `/dev/gpiochip0` | # Input Example ```c #include #include int main(void) { struct gpiod_chip *chip; struct gpiod_line_settings *settings; struct gpiod_line_config *line_cfg; struct gpiod_request_config *req_cfg; struct gpiod_line_request *request; unsigned int offset = 36; int value; chip = gpiod_chip_open("/dev/gpiochip0"); if (!chip) { perror("gpiod_chip_open"); return 1; } settings = gpiod_line_settings_new(); gpiod_line_settings_set_direction(settings, GPIOD_LINE_DIRECTION_INPUT); line_cfg = gpiod_line_config_new(); gpiod_line_config_add_line_settings(line_cfg, &offset, 1, settings); req_cfg = gpiod_request_config_new(); gpiod_request_config_set_consumer(req_cfg, "m1-gpio-input"); request = gpiod_chip_request_lines(chip, req_cfg, line_cfg); if (!request) { perror("gpiod_chip_request_lines"); return 1; } value = gpiod_line_request_get_value(request, offset); printf("value=%d\n", value); gpiod_line_request_release(request); gpiod_line_config_free(line_cfg); gpiod_line_settings_free(settings); gpiod_request_config_free(req_cfg); gpiod_chip_close(chip); return 0; } ``` ```bash gcc -Wall -o gpio_input gpio_input.c -lgpiod sudo ./gpio_input ``` # Output Example ```c #include #include #include int main(void) { struct gpiod_chip *chip; struct gpiod_line_settings *settings; struct gpiod_line_config *line_cfg; struct gpiod_request_config *req_cfg; struct gpiod_line_request *request; unsigned int offset = 36; chip = gpiod_chip_open("/dev/gpiochip0"); if (!chip) { perror("gpiod_chip_open"); return 1; } settings = gpiod_line_settings_new(); gpiod_line_settings_set_direction(settings, GPIOD_LINE_DIRECTION_OUTPUT); gpiod_line_settings_set_output_value(settings, GPIOD_LINE_VALUE_ACTIVE); line_cfg = gpiod_line_config_new(); gpiod_line_config_add_line_settings(line_cfg, &offset, 1, settings); req_cfg = gpiod_request_config_new(); gpiod_request_config_set_consumer(req_cfg, "m1-gpio-output"); request = gpiod_chip_request_lines(chip, req_cfg, line_cfg); if (!request) { perror("gpiod_chip_request_lines"); return 1; } sleep(1); gpiod_line_request_set_value(request, offset, GPIOD_LINE_VALUE_INACTIVE); gpiod_line_request_release(request); gpiod_line_config_free(line_cfg); gpiod_line_settings_free(settings); gpiod_request_config_free(req_cfg); gpiod_chip_close(chip); return 0; } ``` ```bash gcc -Wall -o gpio_output gpio_output.c -lgpiod sudo ./gpio_output ``` # Notes - The actual line offset must be confirmed against the development board's pin definitions. - If execution fails, first use `gpioinfo /dev/gpiochip0` to check whether the line is in use. - If the compiler reports that `gpiod.h` cannot be found, confirm that `libgpiod-dev` is installed.